Atomic অপারেশন হলো এক ধরণের অপারেশন যা indivisible (অবিভাজ্য)। এটি এমনভাবে ডিজাইন করা হয়েছে যাতে কোনো থ্রেড অপারেশনটি সম্পূর্ণ করা ছাড়া ডেটার উপর কাজ সম্পন্ন করতে না পারে এবং অন্য কোনো থ্রেড এই প্রক্রিয়াতে হস্তক্ষেপ করতে পারে না। JavaScript Atomics API মাল্টি-থ্রেডেড প্রোগ্রামিংয়ে এই ধরণের অপারেশন সম্পাদন করতে ব্যবহৃত হয়।
Atomic অপারেশনের মূল কনসেপ্ট
Atomic অপারেশন কাজ করে নিম্নলিখিত নীতির উপর ভিত্তি করে:
- অবিভাজ্য (Indivisibility): একটি অপারেশন একবার শুরু হলে তা সম্পূর্ণ না হওয়া পর্যন্ত অন্য কোনো থ্রেড হস্তক্ষেপ করতে পারে না।
- Consistency (ডেটার সঠিকতা): একই সময়ে একাধিক থ্রেড কাজ করলেও ডেটার মান সঠিক থাকে।
- Thread-safe: একাধিক থ্রেড একই ডেটার উপর কাজ করলেও অপারেশন থ্রেড-সেফ থাকে।
- Non-blocking: Atomics ব্যবহার করে ব্লক ছাড়াই ডেটা ম্যানিপুলেশন করা যায়।
Atomics API কীভাবে কাজ করে
Atomics API SharedArrayBuffer এর মাধ্যমে typed arrays-এর উপর কাজ করে। এই API নিম্নলিখিত ধাপে কাজ করে:
- Shared Memory তৈরি করা:
SharedArrayBuffer ব্যবহার করে একটি মেমোরি তৈরি করা হয় যা একাধিক থ্রেডের মধ্যে ভাগ করা যায়। - Typed Array তৈরি করা:
SharedArrayBuffer-এর সাথে যুক্ত একটি Typed Array তৈরি করা হয়, যেমনInt32Array। - Atomics অপারেশন সম্পাদন করা:
Atomics API এর ফাংশনগুলো যেমনAtomics.add(),Atomics.store()এবংAtomics.load()ব্যবহার করে atomic অপারেশন সম্পন্ন করা হয়।
Atomic অপারেশনের উদাহরণ
১. Atomics.store এবং Atomics.load
// Shared Memory তৈরি
const sharedBuffer = new SharedArrayBuffer(1024); // 1KB মেমোরি বরাদ্দ
const typedArray = new Int32Array(sharedBuffer);
// Atomics.store() ব্যবহার করে ডেটা সেট করা
Atomics.store(typedArray, 0, 42); // Index 0 এ 42 সেট করা
// Atomics.load() ব্যবহার করে ডেটা পড়া
const value = Atomics.load(typedArray, 0);
console.log(value); // আউটপুট: 42
২. Atomics.add (Increment অপারেশন)
const sharedBuffer = new SharedArrayBuffer(1024);
const typedArray = new Int32Array(sharedBuffer);
// Index 0 তে ভ্যালু ১০ সেট করা
Atomics.store(typedArray, 0, 10);
// Index 0 এর ভ্যালুতে ৫ যোগ করা
const oldValue = Atomics.add(typedArray, 0, 5);
console.log(oldValue); // আউটপুট: 10 (পুরোনো মান)
console.log(Atomics.load(typedArray, 0)); // আউটপুট: 15 (নতুন মান)
৩. Atomics.compareExchange (Condition-based অপারেশন)
const sharedBuffer = new SharedArrayBuffer(1024);
const typedArray = new Int32Array(sharedBuffer);
// Index 0 তে ভ্যালু ৩০ সেট করা
Atomics.store(typedArray, 0, 30);
// Index 0 তে ভ্যালু ৩০ থাকলে সেটিকে ৫০-এ পরিবর্তন করা
Atomics.compareExchange(typedArray, 0, 30, 50);
console.log(Atomics.load(typedArray, 0)); // আউটপুট: 50
৪. Atomics.wait এবং Atomics.notify (Thread Synchronization)
const sharedBuffer = new SharedArrayBuffer(1024);
const typedArray = new Int32Array(sharedBuffer);
// Thread Synchronization
setTimeout(() => {
Atomics.store(typedArray, 0, 1); // Index 0 তে ভ্যালু ১ সেট করা
Atomics.notify(typedArray, 0, 1); // ১টি থ্রেডকে নোটিফাই করা
}, 1000);
// অপেক্ষা করা থ্রেড
Atomics.wait(typedArray, 0, 0); // Index 0 এ ভ্যালু ০ না হওয়া পর্যন্ত অপেক্ষা
console.log("Thread Resumed"); // আউটপুট: Thread Resumed
Atomics ফাংশন এবং তাদের কাজ
১. Reading এবং Writing অপারেশন
Atomics.load(typedArray, index): নির্দিষ্ট index থেকে ভ্যালু পড়ে।Atomics.store(typedArray, index, value): নির্দিষ্ট index এ একটি ভ্যালু সংরক্ষণ করে।
২. Arithmetic অপারেশন
Atomics.add(typedArray, index, value): নির্দিষ্ট index এর ভ্যালুতে value যোগ করে।Atomics.sub(typedArray, index, value): নির্দিষ্ট index থেকে value বিয়োগ করে।
৩. Bitwise অপারেশন
Atomics.and(typedArray, index, value): AND অপারেশন সম্পন্ন করে।Atomics.or(typedArray, index, value): OR অপারেশন সম্পন্ন করে।Atomics.xor(typedArray, index, value): XOR অপারেশন সম্পন্ন করে।
৪. Synchronization অপারেশন
Atomics.wait(typedArray, index, value, timeout): থ্রেড নির্দিষ্ট value পরিবর্তনের জন্য অপেক্ষা করে।Atomics.notify(typedArray, index, count): নির্দিষ্ট সংখ্যক থ্রেডকে নোটিফাই করে।
কেন Atomics প্রয়োজন?
- Thread Safety নিশ্চিত করা: একাধিক থ্রেডের মধ্যে ডেটা সঠিক রাখা।
- Race Condition প্রতিরোধ: একাধিক থ্রেড কাজ করার সময় ডেটার অবস্থাকে সঠিক রাখা।
- Concurrency Management: থ্রেডগুলোর মধ্যে সমন্বয় বজায় রাখা।
- Low-Level Control: Atomic অপারেশনের মাধ্যমে ডেটা এবং মেমোরি সরাসরি নিয়ন্ত্রণ করা।
Atomics API multithreaded programming এ thread-safe operations সম্পন্ন করার জন্য অপরিহার্য। এটি atomicity, consistency, এবং synchronization নিশ্চিত করে, যা মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলোর ডেটা ম্যানিপুলেশনে অত্যন্ত কার্যকর।
Read more